//
//  GameMatrix.h
//  Chart
//
//  Created by CaoJun on 15/3/30.
//
//

#ifndef __Chart__GameMatrix__
#define __Chart__GameMatrix__

#include "KLineData.h"
#include "IndexData.h"
#include <string>
#include <vector>

namespace ytx {
    
    namespace GameMatrixType {
        enum GameMatrixType{
            Short = -1,
            Flat = 0,
            Long = 1
        };
    }
    
    struct GameMatrixItem {
        YTXTime tradedate;
        GameMatrixType::GameMatrixType type; // longshort

        double bound1; //bound1 始终大于 bound2
        double bound2;
    };
    
    class GameMatrix : public IndexData
    {
    public:
        GameMatrix(IndexConfig indexConfig);
        
        virtual void calculate(Quotation * data);
        
        virtual void updateLastest(Quotation * data);
        
        virtual void callback(std::string tag, std::string data);
        
        virtual void onFail(std::string tag);
        
        virtual void clearIfParentDataChanged(const Quotation * data);
        
        virtual int getDataLength() const;
        
        virtual void cleanData();
//        virtual bool isInLatestNewK(YTXTime tradedate1, YTXTime tradedate2);
    private:
        bool requesLock;
        
    protected:
        KLineData * kLineData;
        std::vector<GameMatrixItem> gameMatrixData;
        virtual std::vector<GameMatrixItem> getGameMatrixDataFromDB(YTXTime time, const unsigned int limit);
        virtual void getGameMatrixData();
        virtual void getGameMatrixDataFront();
        virtual void getGameMatrixDataBack();
        
        virtual void requestGameMatrixData();
        //取未来
        virtual void requestGameMatrixDataBack(std::string date);
        //取过去
        virtual void requestGameMatrixDataFront(std::string date);
        
        virtual std::vector<GameMatrixItem> parseGameMatrixData(YTXJson::Value data, YTXJson::Value info);
        
        virtual void responseGameMatrixData(YTXJson::Value data, YTXJson::Value info);
        virtual void responseGameMatrixDataFront(YTXJson::Value data, YTXJson::Value info);
        virtual void responseGameMatrixDataBack(YTXJson::Value data, YTXJson::Value info);
        
        virtual void initGameMatrixData(std::vector<GameMatrixItem> gmList);
        virtual void pushGameMatrixData(std::vector<GameMatrixItem> gmList);
        virtual void insertFrontGameMatrixData(std::vector<GameMatrixItem> gmList);
        
        virtual bool saveGameMatrixDataToDB(std::vector<GameMatrixItem>);
        virtual bool hasGameMatrixData();
//        virtual void setGameMatrixData(GameMatrixItem gm);
        
        virtual void realCalculate(KLineData * data);
        
        //-1没找到
        int getGameMatrixIndexInKLinedata(YTXTime time, KLineData * data);
        
        int getGameMatrixIndexInKLinedataFront(KLineData * data);
        int getGameMatrixIndexInKLinedataBack(KLineData * data);
    };
}

#endif /* defined(__Chart__QK__) */
